<?php

class Model {

    protected $_dao; //存储DAO对象的属性，可以在子类方法中被访问，使用DAO对象
    protected $_table; //真实表名
    protected $_fields = array();  //字段列表

    public function __construct()
    {
        $this->_initDao();
        $this->_initTable();
        //调用getFields字段
        $this->getFields();
    }

    /**
     * 初始化DAO
     */
    protected function _initDao() {
        $config = $GLOBALS['config']['db'];
        switch ($GLOBALS['config']['app']['dao']) {
            case 'pdo':
                $dao_class = 'MySQLDB';
                break;
            default:
                $dao_class = 'PDODB';
                break;
        }
        $this->_dao = $dao_class::getInstance($config);
    }

    /**
     * 拼凑真实表名
     */
    protected function _initTable() {
        $this->_table = '`' . $GLOBALS['config']['app']['table_prefix'] . $this->_logic_table . '`';
    }

    /**
     * 获取表字段列表
     */
    private function getFields(){
        $sql = "DESC ". $this->_table;
        $result = $this->_dao->getAll($sql);

        foreach ($result as $v) {
            $this->_fields[] = $v['Field'];
            if ($v['Key'] == 'PRI') {
                //如果存在主键的话，则将其保存到变量$pk中
                $pk = $v['Field'];
            }
        }
        //如果存在主键，则将其加入到字段列表fields中
        if (isset($pk)) {
            $this->_fields['pk'] = $pk;
        }
    }

    /**
     * 自动插入记录
     * @access public
     * @param $list array 关联数组
     * @return mixed 成功返回插入的id，失败则返回false
     */
    public function insert($list){
        $field_list = '';  //字段列表字符串
        $value_list = '';  //值列表字符串
        foreach ($list as $k => $v) {
            if (in_array($k, $this->_fields)) {
                $field_list .= "`".$k."`" . ',';
                $value_list .= "'".$v."'" . ',';
            }
        }
        //去除右边的逗号
        $field_list = rtrim($field_list,',');
        $value_list = rtrim($value_list,',');
        //构造sql语句
        $sql = "INSERT INTO `{$this->_table}` ({$field_list}) VALUES ($value_list)";

        if ($this->_dao->query($sql)) {
            # 插入成功,返回最后插入的记录id
            return $this->_dao->getInsertId();
            //return true;
        } else {
            # 插入失败，返回false
            return false;
        }

    }

    /**
     * 自动更新记录
     * @access public
     * @param $list array 需要更新的关联数组
     * @return mixed 成功返回受影响的记录行数，失败返回false
     */
    public function update($list){
        $uplist = ''; //更新列表字符串
        $where = 0;   //更新条件,默认为0
        foreach ($list as $k => $v) {
            if (in_array($k, $this->_fields)) {
                if ($k == $this->_fields['pk']) {
                    # 是主键列，构造条件
                    $where = "`$k`=$v";
                } else {
                    # 非主键列，构造更新列表
                    $uplist .= "`$k`='$v'".",";
                }
            }
        }
        //去除uplist右边的
        $uplist = rtrim($uplist,',');
        //构造sql语句
        $sql = "UPDATE `{$this->_table}` SET {$uplist} WHERE {$where}";

        if ($this->_dao->query($sql)) {
            # 成功，并判断受影响的记录数
            if ($rows = $this->_dao->getAffectRows()) {
                # 有受影响的记录数
                return $rows;
            } else {
                # 没有受影响的记录数，没有更新操作
                return false;
            }
        } else {
            # 失败，返回false
            return false;
        }

    }

    /**
     * 自动删除
     * @access public
     * @param $pk mixed 可以为一个整型，也可以为数组
     * @return mixed 成功返回删除的记录数，失败则返回false
     */
    public function delete($pk){
        $where = 0; //条件字符串
        //判断$pk是数组还是单值，然后构造相应的条件
        if (is_array($pk)) {
            # 数组
            $where = "`{$this->_fields['pk']}` in (".implode(',', $pk).")";
        } else {
            # 单值
            $where = "`{$this->_fields['pk']}`=$pk";
        }
        //构造sql语句
        $sql = "DELETE FROM `{$this->_table}` WHERE $where";

        if ($this->_dao->query($sql)) {
            # 成功，并判断受影响的记录数
            if ($rows = $this->_dao->getAffectRows()) {
                # 有受影响的记录
                return $rows;
            } else {
                # 没有受影响的记录
                return false;
            }
        } else {
            # 失败返回false
            return false;
        }
    }

    /**
     * 通过主键获取信息
     * @param $pk int 主键值
     * @return array 单条记录
     */
    public function selectByPk($pk){
        $sql = "select * from `{$this->_table}` where `{$this->_fields['pk']}`=$pk";
        return $this->_dao->getRow($sql);
    }

    /**
     * 获取总的记录数
     * @param string $where 查询条件，如"id=1"
     * @return number 返回查询的记录数
     */
    public function total($where){
        if(empty($where)){
            $sql = "select count(*) from {$this->_table}";
        }else{
            $sql = "select count(*) from {$this->_table} where $where";
        }
        return $this->_dao->getOne($sql);
    }

    /**
     * 分页获取信息
     * @param $offset int 偏移量
     * @param $limit int 每次取记录的条数
     * @param $where string where条件,默认为空
     */
    public function pageRows($offset, $limit,$where = ''){
        if (empty($where)){
            $sql = "select * from {$this->_table} limit $offset, $limit";
        } else {
            $sql = "select * from {$this->_table}  where $where limit $offset, $limit";
        }

        return $this->_dao->getAll($sql);
    }

    protected function escapeString($data) {
        if(is_array($data)) {
            return $this->_dao->escapeAllString($data);
        }
        else {
            return $this->_dao->escapeOneString($data);
        }
    }
}